package Desastres;

import java.util.Observable;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import Excepciones.FueraDeLimites;
import Juego.SerializablePropia;
import MapaStuff.Hectarea;
import MapaStuff.Mapa;
import Ubicacion.Direccion;
import Ubicacion.Punto;

public class Godzilla extends Observable implements SerializablePropia {
	
	private Mapa mapaActual;
	private Hectarea hectareaActual;
	private Direccion direccion;
	
	public Godzilla(){
		mapaActual = Mapa.darMapa();
		hectareaActual = null;
		setChanged();
		notifyObservers();
	}
	
	public void atacar(Hectarea unaHectarea) {
		unaHectarea.daniarConstruccion(this);	
	}
	
	public void despertar () {
		try {
			hectareaActual = mapaActual.hectareaLimite();
			hectareaActual.tieneGodzilla();
			this.atacar(hectareaActual);
			setChanged();
			notifyObservers();
		} catch (FueraDeLimites e) {
			// no puede ser fuera de limites
		}
		direccion = Direccion.direccionAlAzar();
	}

	public void situarEn(int i, int j) throws FueraDeLimites {
		hectareaActual = mapaActual.darHectarea(new Punto(i, j));
	}

	public void mover() {
		hectareaActual.godzillaSeFue();
		try {
			hectareaActual = direccion.hectareaSiguiente(hectareaActual);
			hectareaActual.tieneGodzilla();
			this.atacar(hectareaActual);
			setChanged();
			notifyObservers();
		} catch (FueraDeLimites e) {
			this.dormir();
		}
	}
	
	public void dormir() {
		hectareaActual = null;
		direccion = null;
		setChanged();
		notifyObservers();
	}

	public void direccionar (Direccion nuevaDireccion){
		direccion = nuevaDireccion;
	}

	public boolean estaEn(int i, int j) {
		return ( hectareaActual.punto().equals(new Punto (i,j)) );
	}
	
	public boolean estaDormido(){
		return (hectareaActual == null);
	}

	public Element serializar(Document doc) {
		 Element eleGod=doc.createElement("Godzilla");
		 eleGod.setAttribute("estaDespierto",Boolean.toString(false));
		 eleGod.setAttribute("Clase",Godzilla.class.getName());
		 if(hectareaActual!=null && direccion!=null){
			 eleGod.appendChild(hectareaActual.punto().serializar(doc));
			 eleGod.appendChild(direccion.serializar(doc));
			 eleGod.setAttribute("estaDespierto",Boolean.toString(true));
		 }
		 return eleGod;
	}
	
	public static Godzilla hidratar(Node node){
		Element ele=(Element)node;
		Godzilla nuevo=new Godzilla();
		boolean estaDespierto=Boolean.parseBoolean(ele.getAttribute("estaDespierto"));
		if(estaDespierto){
			try{
				Punto punto=Punto.hidratar(ele.getChildNodes().item(0));
				nuevo.hectareaActual=Mapa.darMapa().darHectarea(punto);
				nuevo.direccion=Direccion.hidratar(ele.getChildNodes().item(1));
			}catch(FueraDeLimites e){}
		}
		return nuevo;
		
	}

	public Punto posicion() {
		return hectareaActual.punto();
	}
	
	


}
